package com.gitee.feizns.quickstart.web.ex;

import com.gitee.feizns.dynamic.reflect.Fields;
import org.springframework.util.StringUtils;

/**
 * 错误码枚举接口<br/>
 * <p>
 *     对应使用枚举作为错误码时、仅实现{@link ErrorCode}中的方法<br/>
 *     该类对枚举作为错误码做了一个简单的规范（直接返回实例中的code字段作为错误码和使用对应枚举名字或异常名字作为错误信息）
 * </p>
 * @see ErrorCode
 * @author feizns
 * @since 2019/7/7
 */
public interface ErrorCodeEnums extends ErrorCode {

    /**
     * 未知的错误
     */
    ErrorCodeEnums UNKNOWN = new ErrorCodeEnums() {};

    /**
     * 错误码字段名称（默认反射读取错误码）
     * @see #getCode()
     */
    String CODE_FIELD_NAME = "code";

    /**
     * 没有错误码的情况返回 -1
     */
    int DEFAULT_CODE = -1;

    /**
     * 默认的错误消息
     */
    String DEFAULT_MSG = "UNKNOWN";

    @Override
    default Integer getCode() {
        Object data = Fields.data(this, CODE_FIELD_NAME);
        if (data instanceof Number)
            return ((Number) data).intValue();
        if ( this instanceof Enum )
            return ((Enum<?>) this).ordinal();
        return DEFAULT_CODE;
    }

    @Override
    default String getMsg() {
        if ( this instanceof Enum )
            return ((Enum<?>) this).name();
        if ( this instanceof Throwable ) {
            String defaultMsg = Throwable.class.getSimpleName();
            Throwable e = (Throwable) this;
            return StringUtils.hasText(e.getMessage()) ? e.getMessage() : defaultMsg;
        }
        return DEFAULT_MSG;
    }

}



